﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace DataAccessComponents
{
    public class Rezerwacja : INotifyPropertyChanged,IDataErrorInfo
    {
        /// <summary>
        /// Id rezerwacja
        /// </summary>
        private int id_rezerwacja;

        public int Id_rezerwacja
        {
            get { return id_rezerwacja; }
            set { id_rezerwacja = value; czy_zmiana = true; NotifyPropertyChanged("Id_rezerwacja"); }
        }
        
        /// <summary>
        /// Id termin
        /// </summary>
        private int id_termin;

        public int Id_termin
        {
            get { return id_termin; }
            set { id_termin = value; czy_zmiana = true; NotifyPropertyChanged("Id_termin"); }
        }

        /// <summary>
        /// Id termin
        /// </summary>
        private Termin termin;

        public Termin Termin
        {
            get { return termin; }
            set { termin = value; czy_zmiana = true; NotifyPropertyChanged("Termin"); }
        }



        /// <summary>
        /// Wartosc rezerwacji
        /// </summary>
        private Decimal wartosc;

        public Decimal Wartosc
        {
            get { return wartosc; }
            set { wartosc = value; czy_zmiana = true; NotifyPropertyChanged("Wartosc"); }
            
        }

        /// <summary>
        /// Ilosc dorosłych
        /// </summary>
        private int ilosc_doroslych;

        public int Ilosc_doroslych
        {
            get { return ilosc_doroslych; }
            set { ilosc_doroslych = value; czy_zmiana = true; NotifyPropertyChanged("Ilosc_doroslych"); }
        }

        /// <summary>
        /// Ilosc dzieci
        /// </summary>
        private int ilosc_dzieci;

        public int Ilosc_dzieci
        {
            get { return ilosc_dzieci; }
            set { ilosc_dzieci = value; czy_zmiana = true; NotifyPropertyChanged("Ilosc_dzieci"); }
        }

        /// <summary>
        /// Id klienta
        /// </summary>
        private int id_klient;

        public int Id_klient
        {
            get { return id_klient; }
            set { id_klient = value; czy_zmiana = true; NotifyPropertyChanged("Id_klient"); }
        }
        /// <summary>
        /// Klient korzystający z rezerwacji
        /// </summary>
        private Klient klient;

        public Klient Klient
        {
            get { return klient; }
            set { klient = value; czy_zmiana = true; NotifyPropertyChanged("Klient"); }
        }

        /// <summary>
        /// Numer rezerwacji
        /// </summary>
        private String numer_rezerwacji;

        public String Numer_rezerwacji
        {
            get { return numer_rezerwacji; }
            set { numer_rezerwacji = value; czy_zmiana = true; NotifyPropertyChanged("Numer_rezerwacji"); }
        }

        /// <summary>
        /// Status rezerwacji
        /// </summary>
        private string status;

        public string Status
        {
            get { return status; }
            set { status = value; }
        }

        /// <summary>
        /// Dodatkowe uslugi z których skorzystał klient
        /// </summary>
        private string dodatkowe_uslugi;

        public string Dodatkowe_uslugi
        {
            get { return dodatkowe_uslugi; }
            set { dodatkowe_uslugi = value; }
        }

        /// <summary>
        /// Gdy nastopiła zmiana w obiekcie do to na true
        /// </summary>
        private bool czy_zmiana;

        public bool Czy_zmiana
        {
            get { return czy_zmiana; }
            set { czy_zmiana = value; }
        }

        /// <summary>
        /// Cena uslug dodatkowych
        /// </summary>
        private decimal cena_dodatkowe;

        public decimal Cena_dodatkowe
        {
            get { return cena_dodatkowe; }
            set { cena_dodatkowe = value; }
        }

        /// <summary>
        /// Id oddziału który ma obsłużyć rezerwacja
        /// </summary>
        private int id_oddzial;

        public int Id_oddzial
        {
            get { return id_oddzial; }
            set { id_oddzial = value; }
        }

        private Oddzial oddzial;

        public Oddzial Oddzial
        {
            get { return oddzial; }
            set { oddzial = value; }
        }


        /// <summary>
        /// Konstruktor obiektu Rezerwacja
        /// </summary>
        /// <param name="idr">Id rezerwacja</param>
        /// <param name="idt">Id termin</param>
        /// <param name="term">Termin</param>
        /// <param name="wart">Wartość rezerwacji</param>
        /// <param name="id">Ilosc dorosłych</param>
        /// <param name="idz">Ilosc dzieci</param>
        
        public Rezerwacja(int idr, int idt,Termin term, Decimal wart, int id, int idz)
        {
            this.id_rezerwacja = idr;
            this.id_termin = idt;
            this.wartosc = wart;
            this.ilosc_doroslych = id;
            this.ilosc_dzieci = idz;
            this.termin = term;
            this.status = "niepotwierdzone";
            this.dodatkowe_uslugi = "";
            this.cena_dodatkowe = 0;
            this.id_oddzial = 0;
            this.oddzial = new Oddzial();
            
        }

        public Rezerwacja()
            : this(0, 0,new Termin(),0, 0, 0)
        {
        }

        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        #region Private Helpers
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

            }
        }
        #endregion

        public string Error
        {
            get { return string.Empty; }
        }

        public string this[string propertyName]
        {
            get {
                string result = string.Empty;
                propertyName = propertyName ?? string.Empty;

                if (propertyName == "Wartosc")
                {
                    if (this.Wartosc < 0)
                    {
                        result = "Pole \"Wartość\" nie może zawierać wartości ponieżej zera";
                    }
                }
                else if (propertyName == "Ilosc_doroslych")
                {
                    if (this.Ilosc_doroslych < 0)
                    {
                        result = "Pole \"Ilosc_doroslych\" nie może zawierać wartości ponieżej zera";
                    }else
                        if (this.Ilosc_doroslych > 3)
                        {
                            result = "Pole \"Ilosc_doroslych\" nie może zawierać wartości powyżej 3";
                        }
                }
                else if (propertyName == "Ilosc_dzieci")
                {
                    if (this.Ilosc_dzieci < 0)
                    {
                        result = "Pole \"Ilosc_dzieci\" nie może zawierać wartości ponieżej zera";
                    }else
                        if (this.Ilosc_dzieci > 2) {
                            result = "Pole \"Ilosc_dzieci\" nie może zawierać wartości ponieżej zera";
                        }
                }
                else if (propertyName == "Numer_rezerwacji")
                {
                    if (!Regex.IsMatch(this.Numer_rezerwacji, @"^R-[0-9]{4}-[1-9]+$"))
                    {
                        result = "Pole \"Numer_rezerwacji\" zawiera niepoprawny format.";
                    }
                }



                return result;
            }
        }
    }

}
